package com.cskaoyan.javase._2inner._0introduction;

/**
 * 引例
 * 我们现在做一个应用程序，需要描述一台电脑中的CPU，对于电脑而言，该怎么去描述这个CPU呢？
 *
 * 分析：
 * 我们可以创建两个类，一个描述Computer，一个描述CPU。
 * 但这样明显是有问题的：
 * 1.CPU是电脑中最重要的组件，但它脱离电脑存在就是一粒沙子。
 *      这意味着CPU对象，应仅存在于Computer内部。
 *      这个按照以往的知识语法是做不到的.
 *
 * 2.CPU可以控制计算机的一切硬件资源。
 *      这意味CPU对象能够操控，Computer类中的所有成员，无论私有。
 *      需求: 一个类的对象要能够无条件访问另外一个类的所有成员,无论私有
 *      这个按照以往的知识语法也是做不到的.
 *
 * 定义普通类CPU是不能完成需求的，因为：
 *      1.普通类没有私有概念，不可能控制仅能在Computer内部创建对象。
 *      2.普通类不可能直接访问，其它类的私有成员。
 * 显然CPU类不应该是一个普通类，不应该是一个独立的类
 *      ---> 不再将CPU类定义为一个独立的类
 *      而是将它放入Computer类的类体中,可以近似的看成是一个Computer类的成员
 *      ---> CPU类近似看成Computer类的成员，于是：
 *
 *      1.在其它类内部的类，就有了私有概念，就有了四种访问权限。
 *          只需要在内部私有化一个类，那么在外界就无法创建它的对象了。
 *      2.既然已经成为了成员，成为了"自己人"，那么就不再受限于权限控制了
 *          内部类就可以访问包裹它的类的所有成员，包括私有。
 *
 * 上述两条，其实就是（成员）内部类的主要特点。也说明了使用内部类的主要场景：
 *      1.内部类是一种比类更加极致的封装思想体现
 *          内部类的成员不仅被类自身保护，还被包裹着它的类保护。
 *
 *      2.内部类和包裹它的类互相成为了"好兄弟"
 *          互相访问成员都不受访问权限限制。
 *
 * 当你有以上使用场景时，就可以考虑使用内部类了。
 * 学习内部类之前,声明:
 *      内部类更多是一个为了精巧的设计而诞生的语法,不学习它,Java很多代码都看不懂
 *          比如典型的集合体系
 *      但是我们不是天生就会写精巧设计的,需要时间积淀
 *
 * 学习的要求:
 *      学习内部类,不要求会使用,不要求会去做设计
 *      只要求看懂语法,会用语法就可以了
 *
 * 为了上课方便，我们需要统一口径，在内部类课程当中，我们统一规定：
 * 像CPU这种，定义在别的类的内部的类，我们称之为内部类。（inner）
 * 像Computer这种，包裹内部类的，我们称之为外围类。（enclosed）
 * Demo这种类我们称之为外部类。（outside）
 *
 * @since 15:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // new Cpu();
    }
}

class Computer {
    private Cpu cpu;

    // 私有化,内部类,该内部类仅在本类中生效
    private class Cpu {
        private int num;
    }
}

// class Cpu{
//
// }